#ifndef B2D_GLCONTEXT_H
#define B2D_GLCONTEXT_H

#include "IGraphicContext.h"

NS_B2D_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Gets OpenGL version.
///
/// \param [out]	major	The major version.
/// \param [out]	minor	The minor version.
////////////////////////////////////////////////////////////////////////////////////////////////////
void getGLVersion(int& major, int& minor);

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	OpenGL context
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API GLContext
	: public IGraphicContext
{
private:
#if B2D_PLATFORM == B2D_PLATFORM_WIN32
	HWND	hWND;
	HDC				hDC;
	HGLRC			hGLRC;
#endif

	static GLContext SharedContext;

public:
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Initialises the shared context.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	static void InitialiseShared(void);
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Destroys the shared context.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	static void DestroyShared(void);

	// ::IGraphicContext methods
	void initialise(const BaseWindow& window, WindowOptions& opts);
	void destroy(void);
	void makeCurrent(void);
	void swapBuffers(bool vSync);

private:
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Creates the OpenGL context.
	///
	/// \param [in,out]	opts	Options for the window.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void createContext(WindowOptions& opts);
};

NS_B2D_END

#endif